"通过 :version 来查看vim配置等文件的路径
"从Win下拷到Linux下 ，需要运行 sed -i "s/\r//" ~/.vim/vimrc
""""""""""""""""""""我的配色方案""""""""""""""""""""""""""
"推荐配色：
"atom,biogoo,clarity,calmar256-light,campfire,cyberpunk,darkblue,darkblue2,desert256,desertEx,dusk,ecostation,hornet,iangenzo,inkpot,jammy,janah,lucario,molokai,moria,mustang,navajo-night,newpaper,night,northsky,no-quarter,oceanic_material,PaperColor,peaksea,rdark,rootwater,settlemyer,tabula,tango2,tango-desert,tchaba,tir_black,torte,vibrantink,vividchalk,wombat256,xoria256,zenburn
"在设置 colorscheme, t_Co 和 termguicolors 之前设置 t_8f 和 t_8b
"见:help: xterm-true-color, t_8f, t_8b。
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
"打开真彩色支持,win7 以下 CMD 需要单独设置
if has("win16") || has("win32")
    set t_Co=16
else
    set t_Co=256
endif
set background=dark
"终端时开启配色，需要终端和vim主题配合使用
if has('termguicolors')
	set termguicolors
endif
"使用随机配色插件randomColorPicker.vim来选择配色，注释下面的设置
"根据终端或GUI界面来选择不同的colorscheme
"if has("gui_running")
"    colorscheme dusk
"else
"    colorscheme desert
"endif
"将vim定制为通用文本编辑器，以代替浏览器中的编辑框
augroup textEditor
    if has("gui_running")
        autocmd!
        au BufRead,BufNewFile *.text set guifont=Hack\ 16 | colorscheme fine_blue2 | set lines=13 columns=70 | set nofixeol | setlocal list | setlocal linespace=10
        "text格式下，离开时自动复制到剪贴板
        au BufLeave,WinLeave *.text  ggVG"+y
    endif
augroup END
"终端中，insert模式下使光标显示竖线，在normal模式下显示方块
if !has("gui_running")
	let &t_SI = "\e[5 q"
	let &t_EI = "\e[1 q"
	let &t_SR = "\e[3 q"
endif
"不兼容旧版vi的模式
set nocp
"记住上次编辑文件的一些设置
set viminfo+=!
" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-
"打开状态栏标尺,在状态栏显示光标的行号和列号
set ruler
"打开行号和相对行号relativenumber
"在normal模式、insert模式和失去焦点情况下，分别显示不同状态的行号。
set number
augroup relativenumbertoggle
	autocmd!
	autocmd BufEnter,FocusGained,WinEnter,InsertLeave * if &number | set norelativenumber | endif
	autocmd BufLeave,FocusLost,WinLeave,InsertEnter * if &number | set relativenumber | endif
augroup END
"高亮当前行和当前列
"set cursorcolumn
set cursorline
"设置光标在所有模式下都不闪烁
set guicursor=a:blinkon0
"滚动时，光标移动时距离边框的行/列数，设set so=999可保证光标永远在屏幕中间
"将j、k映射为gjzz、gkzz也很方便
set scrolloff=10
"打开文件，光标回到上次编辑的位置
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
"set sidescrolloff=5
"历史记录 20 -1000
set history=500
"可视化警告
set visualbell
"文件关闭后依然维护撤销历史纪录-启用后可以一直撤销到新建文件状态，不建议开启
"if !isdirectory($HOME.'/.vimtmp/undo')
"	call mkdir($HOME.'/.vimtmp/undo', 'p')
"endif
"set undodir=~/.vimtmp/undo
"set undofile
"管理备份文件backup，与writebuckup配合
set nobackup
if !isdirectory($HOME.'/.vimtmp/backup')
	call mkdir($HOME.'/.vimtmp/backup', 'p')
endif
set backupdir=$HOME/.vimtmp/backup/
au BufWritePre * :call writefile(getline('1', '$'), &backupdir.strftime("%Y%m%d%H").'_'.substitute(expand("%:p"), '[/\\:]', '%', 'g'), 'b')
"设置swapfile
if !isdirectory($HOME.'/.vimtmp/swap')
	call mkdir($HOME.'/.vimtmp/swap', 'p')
endif
set directory=$HOME/.vimtmp/swap/,/tmp//
"根据文件自动切换目录
set autochdir
"打开拼写检查并忽略中文
set spelllang=en,cjk
""""""""""""""""""搜索"""""""""""""""""""""""""""
set hls    		"搜索时高亮显示被找到的文本
set incsearch    	"打开实时搜索
set ignorecase    	"忽略大小写
set smartcase     	"智能匹配，小写兼容大写，大写不兼容小写
set shortmess-=S    "显示匹配搜索结果的数量及当前为第几个结果
"高亮匹配的括号
set showmatch
"打开关键字上色(语法高亮)
syntax on
"自动缩进和智能缩进
set autoindent
set smartindent
"复制粘贴时保持缩进
set copyindent
"加强Backspace的功能,退格（删除）键可以一次性删掉一级缩进，可以删到上一行等，vim 专用，neovim 默认支持
set backspace=indent,eol,start
"使hjkl键可以折行
set whichwrap=b,s,<,>,[,],h,l
"不在空格等处断行
set breakat=
"根据窗口宽度换行,不换行为set nowrap
set wrap
"超长行自动换行后逐行滚动（9.0以后支持smoothscroll）
if has("sms")
    set sms
endif
"不在单词中间断行
set linebreak
"设置文本宽度（textwidth）强行换行，可按J合并行
"set textwidth=78
""设置每行超过80个字符后背景变色
set colorcolumn=81
"let &colorcolumn=join(range(81,999),",")
highlight ColorColumn guibg=#303030 ctermbg=0
"不设置 textwidth 时保证不自动折行，见http://m.newsmth.net/article/VIM/45256
let g:leave_my_textwidth_alone=1
"设定窗口大小
if has("gui_running")
	winpos 333 72	"启动时左上角的坐标"
	set lines=33 columns=72
endif
"设定帮助语言，需要安装vimcdoc
set helplang=cn
"GUI 设置，:help guioptions"查看
" i, Icon, 在任务栏显示 gVim 图标
" m, Menu, 显示菜单栏
" t, Tear off，允许菜单被分离出来
" r, Always Right scrollbar,总是在右侧放置滚动条
" b, Bottom scrollbar，在底部放置滚动条
set guioptions=i
"显示不可见符号，例如空格、制表符、换行等
"set list
"set invlist
"定义特殊符号显示效果，符号查找 h: digraph；leadmultispace前导空白可代替缩进线效果
set listchars=tab:\¦\⋅,eol:↵,trail:⋅,precedes:«,extends:»,space:\⋅,leadmultispace:\¦\ \ \ 
" 针对特定类型的代码文件,设置显示Tab键以便在查看代码时注意到它们
autocmd FileType c,python setlocal list | hi SpecialKey guifg=#228b22 | hi NonText guifg=#228b22
"tab与空格设置
set tabstop=4	 "设置tab宽4个空格
set expandtab	 "设置空格代替tab, set noexpandtab表示用制表符表示缩进
set softtabstop=4 "当以上两行未设置时混合使用tab和空格
set shiftwidth=4  "表示换行后自动缩进长度，一般与softtabstop保持一致
" 为rime输入法使用的yaml 文件制订单独的缩进与 tab宽度 
au! BufNewFile,BufReadPost *.{yaml,yml} set filetype=yaml
autocmd FileType yaml setlocal ts=2 sw=2 noexpandtab list lcs=leadmultispace:\¦\۰  "foldmethod=indent
"剪贴板设置，unnamedplus 对应+寄存器；即ctrl + c,ctrl + v桌面系统剪贴板，unnamed 对应*寄存器，即x桌面剪贴板（用鼠标选择复制，用鼠标中键粘贴）
"为避免粘贴时的缩进错乱和卡顿，粘贴时应先set paste，然后在普通模式下Ctrl+p粘贴，之后取消粘贴模式 set nopaste.
"set clipboard^=unnamed,unnamedplus
"支持鼠标
set mouse=a
"命令行高度
set cmdheight=2
"显示输入的命令
set showcmd
"显示当前模式
set showmode
"tab键激活，增强命令补全模式
set wildmenu
"设置命令中的候选项以纵列显示
set wildoptions=pum
"""""""""""""""""""状态栏设置"""""""""""""""""""""""""""""""""""""""""""""
" 一直显示状态栏
set laststatus=2
"""""""""""""状态行根据不同模式，显示不同的颜色"""""""""""""""""""
function! InsertStatuslineColor(mode)
    if a:mode == 'i'
        hi statusline guibg=#FF0000
    elseif a:mode == 'r'
        hi statusline guibg=#0000FF
    else
    endif
endfunction
au InsertEnter * call InsertStatuslineColor(v:insertmode)
au InsertLeave * hi statusline guibg=#FFA500 guifg=#FFFFFF
hi statusline guibg=#BEBEBE guifg=#000000
""""""""""""""""""""""""""""参考 https://zhuanlan.zhihu.com/p/25494323
"设置状态栏信息及颜色
set statusline=
set statusline +=%4*%n%m%r%h%w%*            "缓冲区 
set statusline +=%F                         "文件路径
set statusline +=%=%1*[%2*%{&ff}:%{&fenc!=''?&fenc:&enc}%1*]        "文件编码
set statusline +=[%2*%Y%1*]                 "文件格式
set statusline +=[%2*%03v:%03l%1*/%3*%L(%p%%)%1*]       "行:列/总列(百分比)
set statusline +=%4*%w%h%r%m%n%*            "缓冲区
hi User1 guifg=#BEBEBE
hi User2 guifg=#11DB00
hi User3 guifg=#FFFFFF
hi User4 guifg=#FF0000
hi User5 guifg=#a0ee40
"""""""""""""""""""""""文件类型"""""""""""""""""""""""""""""""
" 侦测文件类型，与设置为 on类似，但会根据后续输入的内容再次检测文件类型，生成文件头的命令不生效。 
filetype detect 
" 载入文件类型插件 
filetype plugin on 
" 为特定文件类型载入相关缩进文件 
filetype indent on 
"""""""""""""将log/md5 视为 text 类型"""""""""""""""""""
au BufRead,BufNewFile *.log 	setfiletype txt
au BufRead,BufNewFile *.md5 	setfiletype txt
au BufRead,BufEnter,BufLeave * if &filetype == "VOOMTREE" | setlocal ft=txt | endif
"" 针对txt高亮插件"https://github.com/calon/txt 制定格式转换
"" 使其在windows下正常工作不报错"
autocmd BufEnter * if &filetype == "text" | setlocal ft=txt | endif
au BufRead,BufNewFile *.MD,*.md,*.mkd,*.markdown	setfiletype markdown
"au BufRead,BufNewFile *.md	setfiletype text
"au BufRead,BufNewFile *.mkd	setfiletype text
""""""""""""""""""""""快捷键映射hotkeymap""""""""""""""""""""""""""""""""""
"键盘映射模式
"
"    map : 正常模式，可视化模式和运算符模式可用
"    nmap ：正常模式可用
"    vmap ：可视化模式可用
"    omap ：运算符模式可用
"    map! ：插入模式和命令行模式可用
"    imap ：插入模式可用
"    cmap ：命令行模式可用
"" 在输入法为中文时也能进入命令行
nnoremap ; :
vnoremap ; :
nnoremap ； :
vnoremap ； :
nnoremap ： :
vnoremap ： :
"" 映射复制粘贴键"
vmap <C-C> "+y
nmap <C-P> "+gp
"" 创建标签快捷键
map  tn  <Esc>:tabnew<CR>
"插入模式时 ff 进入 normal 模式
"并设置一个等待时间，区分正常输入和模式切换的停顿
inoremap ff <Esc>
:autocmd InsertEnter * set timeoutlen=300
:autocmd InsertLeave * set timeoutlen=1000
"" 快速到行首行尾"
nnoremap H 0
nnoremap L $
"" 在txt和markdown之间切换文件格式"
nnoremap  txt  <Esc>:set filetype=txt<CR>
nnoremap  md  <Esc>:set filetype=markdown<CR>zR
"在linux下将caplock映射为esc键并在离开时恢复
"!!需要安装 xorg-xmodmap 软件包，且映射会导致<C-W><C-W>这个窗口切换键变慢，可用<Ctrl-[>来代替 ESC 键。
"if has("linux")
    "au WinEnter * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
    "au WinLeave * silent! !xmodmap -e 'clear Lock' -e 'keycode 0x42 = Caps_Lock'
"endif
"解决终端中vim回normal模式有1s左右延迟的问题
set ttimeout ttimeoutlen=80
"""且不要map任何以ESC开头的热键"""
"ww保存，cc全选并复制，cq复制并退出
nnoremap  ww  <Esc>:w<CR>
nnoremap  cc  <Esc>ggVG"+y
nnoremap  cq  <Esc>ggVG"+y<Esc>:q<CR>
"强制保存
cnoremap w!! w !sudo tee % >/dev/null 
"默认<Leader>为"\"反斜杠
"let mapleader = ","
"nnoremap  <Leader>ww  <Esc>:source %<CR>
nnoremap  <Leader>pp  <Esc>:set paste<CR>
nnoremap  <Leader>p  <Esc>:set nopaste<CR>
nnoremap  cs  <Esc>:CSnext<CR>
"手动显示listchars中的制表符和行首空白以产生缩进线效果
nnoremap <Leader>gs  :call IndentLine()<CR>
function! IndentLine()
    set list!
    highlight SpecialKey guifg=#228b22
    highlight NonText guifg=#228b22
endfunction
"编写zim文件时，切换配色和窗口大小并打开Voom
nnoremap <Leader>zv  :call ZimVoomVim()<CR>
function! ZimVoomVim()
    colorscheme darkblue2
    winpos 345 72	"启动时左上角的坐标"
    set lines=33 columns=113
    let g:voom_tree_placement = "right"
    Voom wiki
endfunction
"在nvim中支持Shift+Insert粘贴"
map! <S-Insert> <C-R>+
"窗口大小调整，实际需要netrw插件支持，默认自带插件
nnoremap <S-Up> :resize -1<CR>
nnoremap <S-Down> :resize +1<CR>
nnoremap <S-Left> :vertical resize -1<CR>
nnoremap <S-Right> :vertical resize +1<CR>
"多窗口移动
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l
"""""""""""""""""""""""光标居中"""""""""""""""""""""""""""""
"单ESC时进入替换模式会有问题，所以使用双ESC取消搜索结果的高亮
nnoremap <esc><esc> :nohl<cr>
nnoremap cls :nohl<cr>
"gj/gk：wrap软折行情况下的移动一屏幕行；zz：将光标所在行居中。
"移动一屏幕行
nnoremap j gjzz
nnoremap k gkzz
"移动一实际行
nnoremap gk k
nnoremap gj j
nnoremap n nzz
nnoremap <s-n> <s-n>zz
"noremap * *zz
"noremap # #zz
"noremap <c-o> <c-o>zz
"noremap <c-i> <c-i>zz
""""""""""""""""set guifont/gfn查看当前字体"""""""""""""""""""""""""""
"""1. set gfn=* 弹出字体选择对话框，用鼠标选择字体
"""2. set gfn=、set gfw= 查看vim当前字体设置方案
"""3. 可同时设置多个字体，用英文逗号分开
"""4. set gfn=font1,font2, 注意两个逗号分隔，表示设置了三个方案，当前两个字体不存在时，让系统自己选择一个字体
if has('gui_running')
	if has("win16") || has("win32") || has("win95") || has("win64")
		set guifont=Consolas:h18:cANSI:qDRAFT,Courier_New:h18:cANSI:qDRAFT,
		set guifontwide=Microsoft\ Yahei\ Mono:h18,youyuan:h18,
	else
		set guifont=DejaVu\ Sans\ Mono\ 16
	endif
endif
"""""""""""""""""""""""""""""统计中文字数""""""""""""""""""""""""""""""""
function! ChineseCount() range
    let save = @z
    silent exec 'normal! gv"zy'
    let text = @z
    let @z = save
    silent exec 'normal! gv'
    let cc = 0
    for char in split(text, '\zs')
        if char2nr(char) >= 0x2000
            let cc += 1
        endif
    endfor
    echo "Count of Chinese charasters is:" cc
endfunc

vnoremap <F7> :call ChineseCount()<cr>
"链接：https://www.zhihu.com/question/54118781/answer/137982087
""""""""""""""""""""""""""""""""vim中文编码设置""""""""""""""""""""""""""""""
"""""""打开文件时依次尝试编码""""""""""""""""
set fileencodings=ucs-bom,utf-8,cp936,gb18030,gbk,gb2312,utf-16le,big5,euc-jp,euc-kr,latin1
set termencoding=utf-8
""设置新文件的编辑为utf-8
set encoding=utf-8
""""解决旧vim和旧windows上的那些乱码问题
"if has("win32")
"	set fileencoding=chinese
"else
"	set fileencoding=utf-8
"endif
"解决字符如①②→——等显示不全的问题
set ambiwidth=double
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-8
"打开断行模块对亚洲语言的支持,可简写为 set fo+=mB
"在可视化模式下，可使用 = 进行代码格式的自动排版
"如果Unicode 值大于255的文本，不必等到空格再折行
set formatoptions+=m
"合并两行中文时，不在中间加空格
set formatoptions+=B
"vim内置开关输入法的选项
set iminsert=2
""-----------------------美化标签栏-----------------------
"""""""""""""""""""""""""""tabbar标签栏配色""""""""""""""""""""""""""
""tabline:非激活标签；tablineSel：激活标签；tablinefill:标签栏其他位置 hi TabLine guifg=Gray guibg=Dimgray ctermfg=Red ctermbg=Yellow 
hi TabLineSel guifg=Gray guibg=Darkslateblue ctermfg=Blue ctermbg=Yellow gui=Bold,Underline cterm=Bold,Underline
hi Title ctermfg=LightBlue ctermbg=Magenta
""""""""""""""""""""""""为tabbar加上编号""""""""""""""""""""""""
set tabline=%!MyTabLine()
function MyTabLine()
  let s = '' " complete tabline goes here
  " loop through each tab page
  for t in range(tabpagenr('$'))
    " select the highlighting for the buffer names
    if t + 1 == tabpagenr()
      let s .= '%#TabLineSel#'
    else
      let s .= '%#TabLine#'
    endif
    " empty space
    let s .= ' '
    " set the tab page number (for mouse clicks)
    let s .= '%' . (t + 1) . 'T'
    " set page number string
    let s .= t + 1 . ' '
    " get buffer names and statuses
    let n = ''  "temp string for buffer names while we loop and check buftype
    let m = 0 " &modified counter
    let bc = len(tabpagebuflist(t + 1))  "counter to avoid last ' '
    " loop through each buffer in a tab
    for b in tabpagebuflist(t + 1)
      " buffer types: quickfix gets a [Q], help gets [H]{base fname}
      " others get 1dir/2dir/3dir/fname shortened to 1/2/3/fname
      if getbufvar( b, "&buftype" ) == 'help'
        let n .= '[H]' . fnamemodify( bufname(b), ':t:s/.txt$//' )
      elseif getbufvar( b, "&buftype" ) == 'quickfix'
        let n .= '[Q]'
      else
        let n .= '['.pathshorten(bufname(b)).']'
        "let n .= bufname(b)
      endif
      " check and ++ tab's &modified count
      if getbufvar( b, "&modified" )
        let m += 1
      endif
      " no final ' ' added...formatting looks better done later
      if bc > 1
        let n .= ' '
      endif
      let bc -= 1
    endfor
    " add modified label [n+] where n pages in tab are modified
    if m > 0
      "let s .= '[' . m . '+]'
      let s.= '+ '
    endif
    " add buffer names
    if n == ''
      let s .= '[No Name]'
    else
      let s .= n
    endif
    " switch to no underlining and add final space to buffer list
    "let s .= '%#TabLineSel#' . ' '
    let s .= ' '
  endfor
  " after the last tab fill with TabLineFill and reset tab page nr
  let s .= '%#TabLineFill#%T'
  " right-align the label to close the current tab page
  if tabpagenr('$') > 1
    let s .= '%=%#TabLine#%999XX'
  endif
  return s
endfunction
"" 窗口标题设置 
if has('title') && (has('gui_running') || &title)
    set titlestring=
    set titlestring+=%F\  " 文件名
    set titlestring+=%h%m%r%w " 编辑状态
    set titlestring+=\ -\ %{v:progname} " 程序名
endif
""""""""""""""""""""文件管理器netrw配置"""""""""""""""""""""""""""""
"设置是否显示横幅
let g:netrw_banner = 0

"设置目录列表的样式：树形
let g:netrw_liststyle = 3

"在之前的窗口编辑文件，类似按下大写 P
let g:netrw_browse_split = 4

"水平分割时，文件浏览器始终显示在左边
let g:netrw_altv = 1

"设置文件浏览器窗口宽度为 25%
let g:netrw_winsize = 25

"自动打开文件浏览器 netrw
"augroup ProjectDrawer
"  autocmd!
"  autocmd VimEnter * :Vexplore
"augroup END
""""""""""""""""""""文件管理器netrw配置结束"""""""""""""""""""""""""
"""""""""""""编译运行热键配置"""""""""""""
" 运行对应文件的映射-from https://zhuanlan.zhihu.com/p/532430825
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
        "exec "!g++ % -o %<"        "c.vimrc中已有编译热键"
        "exec "!time ./%<"
    elseif &filetype == 'sh'
        :!time bash %
    elseif &filetype == 'python'
        exec "!clear"
        exec "!time python3 %"
    elseif &filetype == 'lua'
        exec "!clear"
        exec "!time lua %"
    endif
endfunc
"""""""""""""编译运行热键配置"""""""""""""
"""""""""""""""""""无插件配置vimrc至此结束"""""""""""""""""""
"""""""""""""""""""""""导入插件配置"""""""""""""""""""
if filereadable(expand('$HOME/.vim/rc/myplugin.vimrc'))
    source $HOME/.vim/rc/myplugin.vimrc
endif
"""""""并在~/.vim/rc目录下有 myplugin.vimrc文件""""""""""""""
